Android 지문 인식 개발 사례
다음 내용 은 64 비트 의 하 이 패스 CPU 를 기반 으로 fpc 1020 칩 을 탑재 하고 있 으 며,이 부분 코드 는 원생 안 드 로 이 드 에서 공장 지문 테스트 에 대비 하여 변경 되 었 습 니 다.원생 안 드 로 이 드 지문 입력 은 10 번 채취 해 야 합 니 다.
코드 설명:
1.FingerPrintEnrollBase 클래스:
중요 한 것 은
자바 코드
public interface Listener {
void onEnrollmentHelp(CharSequence helpString);
void onEnrollmentError(int errMsgId, CharSequence errString);
void onEnrollmentProgressChange(int steps, int remaining);
}
이 인터페이스.1)onEnrollment Help 함수:아래쪽 에서 되 돌아 오 는 지문 조작 도움말 정보 입 니 다.
2)onEnrollment Error 함 수 는 하층부 에서 되 돌아 오 는 오류 정보 입 니 다.errMsgId 는 오류 정보 형식 입 니 다.그 중에서 1 은 지문 하드웨어 가 사용 할 수 없 음 을 나타 내 고 3 은 시간 초과,5 는 작업 이 취소 되 었 음 을 나타 냅 니 다.errString 은 errmsgid 에 대응 하 는 문자 정보 로 필요 한 자신의 실험 이 있 으 면 알 수 있 습 니 다.
3)onEnrollment ProgressChange()함 수 는 현재 지문 의 채집 상황 을 표시 합 니 다.steps:총 몇 번 입력 해 야 합 니까?remaining 은 몇 번 남 았 습 니까?저 는 이 함수 에서 Log 를 인쇄 합 니 다.
2.FingerPrintActivity 는 주 Activity 류 이 고 FingerPrintEnrollBase 는 지문 Base 류 입 니 다.
특별한 설명 이 필요 한 것 은 FingerPrintEnrollBase 클래스 에 private byte[]mToken=new byte[69]가 있 습 니 다.이 배열 의 정상 적 인 상황 은 비밀 번 호 를 입력 한 후에 framework 층 을 통 해 hal 층 에 신청 한 것 입 니 다.저 는 그 코드 를 검증 하지 않 기 위해 sizeof(hwauth_token_t)계 산 된 것 은 69 이 므 로 필요 한 것 은 이에 따라 계산 하 십시오.나 는 코드 에서 실험 한 적 이 있다.이 배열 이 69(64 비트 CPU 에서)가 아니라면 프로그램 crach 를 직접 초래 할 것 이다!
fpc 지문 채취 흐름 도:
원본 코드 는 다음 과 같 습 니 다.
FingerPrintEnrollBase:
자바 코드
/*
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License
*/
package com.mediatek.test;
import android.app.Activity;
import android.app.Fragment;
import android.content.Context;
import android.hardware.fingerprint.FingerprintManager;
import android.os.Bundle;
import android.os.CancellationSignal;
import android.os.Handler;
import android.util.Log;
/**
* local fragment to handle the state around fingerprint enrollment.
*/
public class FingerPrintEnrollBase extends Fragment {
private int mEnrollmentSteps = -1;
private int mEnrollmentRemaining = 0;
private Listener mListener;
private boolean mEnrolling;
private CancellationSignal mEnrollmentCancel;
private Handler mHandler = new Handler();
private byte[] mToken = new byte[69];//if byte length != sizeof(hw_auth_token_t), throws Exception
private boolean mDone;
private static final String TAG = "FingerPrintEnrollBase";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
}
@Override
public void onStart() {
super.onStart();
Log.d(TAG, "mToken length="+mToken.length);
if (!mEnrolling) {
FingerprintManager mFpM = (FingerprintManager) getActivity().getSystemService(Context.FINGERPRINT_SERVICE);
startEnrollment(mFpM);
}
}
@Override
public void onStop() {
super.onStop();
if (!getActivity().isChangingConfigurations()) {
cancelEnrollment();
}
}
protected void startEnrollment(FingerprintManager mFpM) {
mHandler.removeCallbacks(mTimeoutRunnable);
mEnrollmentSteps = -1;
mEnrollmentCancel = new CancellationSignal();
if(mFpM != null){
mFpM.enroll(mToken, mEnrollmentCancel, 0, mEnrollmentCallback);
}
mEnrolling = true;
}
protected void cancelEnrollment() {
mHandler.removeCallbacks(mTimeoutRunnable);
if (mEnrolling) {
mEnrollmentCancel.cancel();
mEnrolling = false;
mEnrollmentSteps = -1;
}
}
public void setListener(Listener listener) {
mListener = listener;
}
public int getEnrollmentSteps() {
return mEnrollmentSteps;
}
public int getEnrollmentRemaining() {
return mEnrollmentRemaining;
}
public boolean isDone() {
return mDone;
}
private FingerprintManager.EnrollmentCallback mEnrollmentCallback
= new FingerprintManager.EnrollmentCallback() {
@Override
public void onEnrollmentProgress(int remaining) {
if (mEnrollmentSteps == -1) {
mEnrollmentSteps = remaining;
}
mEnrollmentRemaining = remaining;
mDone = remaining == 0;
if (mListener != null) {
mListener.onEnrollmentProgressChange(mEnrollmentSteps, remaining);
}
}
@Override
public void onEnrollmentHelp(int helpMsgId, CharSequence helpString) {
if (mListener != null) {
mListener.onEnrollmentHelp(helpString);
}
}
@Override
public void onEnrollmentError(int errMsgId, CharSequence errString) {
if (mListener != null) {
mListener.onEnrollmentError(errMsgId, errString);
}
}
};
private final Runnable mTimeoutRunnable = new Runnable() {
@Override
public void run() {
cancelEnrollment();
}
};
public interface Listener {
void onEnrollmentHelp(CharSequence helpString);
void onEnrollmentError(int errMsgId, CharSequence errString);
void onEnrollmentProgressChange(int steps, int remaining);
}
}
FingerPrintActivity:자바 코드
package com.mediatek.test;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import android.R.color;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.os.CancellationSignal;
import android.os.Handler;
import android.os.Message;
import android.text.Spannable;
import android.text.style.ForegroundColorSpan;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TableRow;
import android.widget.TextView;
import android.widget.Toast;
import com.mediatek.test.R;
import android.hardware.fingerprint.Fingerprint;
import android.hardware.fingerprint.FingerprintManager;
public class FingerPrintActivity extends Activity implements FingerPrintEnrollBase.Listener{
private static final String TAG = "FingerPrintActivity";
private MyHandler mHandler = new MyHandler();
private TextView fingerPrintAcquisitionTextView, fingerPrintEnrollmentErrorView, fingerPrintEnrollmentHelpView;
private FingerPrintEnrollBase fpeb;
private FingerprintManager mFingerprintManager;
@Override
protected int setTitleId() {
return R.string.tittle_fingerprint;
}
@Override
protected Activity getActivity() {
return this;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fingerprint);
fingerPrintAcquisitionTextView = (TextView)findViewById(R.id.fingerprint_message);
fingerPrintEnrollmentErrorView= (TextView)findViewById(R.id.fingerprint_enrollment_error);
fingerPrintEnrollmentHelpView= (TextView)findViewById(R.id.fingerprint_enrollment_help);
mFingerprintManager = (FingerprintManager) getActivity().getSystemService(
Context.FINGERPRINT_SERVICE);
}
private void sendMsgToHandler(int msgType, String remark){
Message msg = Message.obtain();
msg.what = msgType;
Bundle bundle = new Bundle();
bundle.putString("result", remark);
msg.setData(bundle);
mHandler.sendMessage(msg);
}
@Override
public void onEnrollmentHelp(CharSequence helpString) {
Log.d(TAG, "==onEnrollmentHelp="+helpString.toString());
sendMsgToHandler(3, helpString.toString());
}
@Override
public void onEnrollmentError(int errMsgId, CharSequence errString) {
Log.d(TAG, "==onEnrollmentError errMsgId="+errMsgId+" errString="+errString.toString());
if(errMsgId == 3){//time out
postEnrollment();
}else if(errMsgId == 1){//hardware lose efficacy
startEnrollment();
}else if(errMsgId == 5){//operation cancel
}else{
sendMsgToHandler(4, errString.toString());
}
}
@Override
public void onEnrollmentProgressChange(int steps, int remaining) {
Log.d(TAG, "===============onEnrollmentProgressChange=======");
Log.d(TAG, "steps" + steps + "||remaining=" + remaining);
fingerPrintEnrollmentHelpView.setText("");
fingerPrintEnrollmentErrorView.setText("");
sendMsgToHandler(2, getString(R.string.fingerprint_validate_success));
buttonS.setEnabled(true);
stopFingerprint();
}
private void startEnrollment(){
if (fpeb == null) {
fpeb = new FingerPrintEnrollBase();
}
fpeb.setListener(this);
fpeb.startEnrollment(mFingerprintManager);
}
private void postEnrollment(){
if(mFingerprintManager != null){
mFingerprintManager.postEnroll();
}
}
private void stopFingerprint() {
if (fpeb != null){
fpeb.cancelEnrollment();
onStop();
}
}
@Override
protected void onStart() {
super.onStart();
}
@Override
protected void onStop() {
super.onStop();
if(fpeb != null){
fpeb.setListener(null);
}
}
@Override
protected void onResume() {
super.onResume();
if(mFingerprintManager == null){
mFingerprintManager = (FingerprintManager) getActivity().getSystemService(
Context.FINGERPRINT_SERVICE);
}
startEnrollment();
}
@Override
protected void onPause() {
super.onPause();
postEnrollment();
mFingerprintManager = null;
stopFingerprint();
fpeb = null;
}
class MyHandler extends Handler{
@Override
public void handleMessage(Message msg) {
Bundle bundle = null;
super.handleMessage(msg);
switch (msg.what) {
case 0:
removeMessages(0);
bundle = msg.getData();
String result = bundle.getString("result");
selfTestView.setText(result);
selfTestView.setTextColor(result.contains("PASS")?Color.GREEN:Color.RED);
break;
case 1:
removeMessages(1);
bundle = msg.getData();
String rs = bundle.getString("result");
checkBroadView.setText(bundle.getString("result"));
checkBroadView.setTextColor(rs.contains("PASS")?Color.GREEN:Color.RED);
break;
case 2:
removeMessages(2);
bundle = msg.getData();
String fingerprint = bundle.getString("result");
fingerPrintAcquisitionTextView.setText(bundle.getString("result"));
fingerPrintAcquisitionTextView.setTextColor(fingerprint.contains("PASS")?Color.GREEN:Color.WHITE);
mButtonSelftest.setEnabled(true);
mButtonCheckerboardTest.setEnabled(true);
break;
case 3:
removeMessages(3);
bundle = msg.getData();
String enrollmentHelp = bundle.getString("result");
fingerPrintEnrollmentHelpView.setText(bundle.getString("result"));
break;
case 4:
removeMessages(4);
bundle = msg.getData();
String enrollmentError = bundle.getString("result");
fingerPrintEnrollmentErrorView.setText(bundle.getString("result"));
fingerPrintAcquisitionTextView.setText("");
break;
default:
break;
}
}
}
}
이상 은 안 드 로 이 드 지문 자료 에 대한 정리 입 니 다.추 후 관련 자 료 를 계속 보충 하 겠 습 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.